/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager;

import br.com.deployment.entidade.acesso.Usuario;
import br.com.deployment.entidade.protocolo.*;
import br.com.deployment.manager.consultar.ManagerConsultarAtoItem;
import br.com.deployment.servico.LancamentoServico;
import br.com.deployment.servico.ProtocoloServico;
import br.com.deployment.servicoimpl.UsuarioServicoImpl;
import br.com.deployment.utilitario.Msg;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author luciano
 */
@ManagedBean
@ViewScoped
public class ManagerLancamento implements Serializable{

    @EJB
    LancamentoServico lancamentoServico;
    @EJB
    ProtocoloServico protocoloServico;
    @EJB
    UsuarioServicoImpl usuarioServico;
    
    private BigDecimal valorTotalProtocolo;
    private BigDecimal valorTotalPagamento;
    private Protocolo protocolo;
    private Pagamento pagamento;
    private BigDecimal totalCredito;
    private BigDecimal totalDebito;
    private BigDecimal totalReceber;
    private BigDecimal totalReceita;
    private BigDecimal totalCartorio;
    private BigDecimal totalFermojupi;
    private int qtdeProtocolos;
    private int qtdePagamentos;
    private int qtdeSelos;
    private Lancamento lancamento;
    private Lancamento removelancamento;
    private Usuario usuario;
    private boolean showLancamento;


    @PostConstruct
    public void init() {
        lancamento = new Lancamento();
        usuario = new Usuario();
        valorTotalPagamento = new BigDecimal(0);
        valorTotalProtocolo = new BigDecimal(0);
        totalCredito = new BigDecimal(0);
        totalDebito = new BigDecimal(0);
        totalReceber = new BigDecimal(0);
        totalReceita = new BigDecimal(0);
        totalCartorio = new BigDecimal(0);
        totalFermojupi = new BigDecimal(0);
        qtdePagamentos = 0;
        qtdeProtocolos = 0;
        qtdeSelos = 0;
        showLancamento = false;
    }

    public boolean isShowLancamento() {
        return showLancamento;
    }

    public void setShowLancamento(boolean showLancamento) {
        this.showLancamento = showLancamento;
    }

    
    
     public Lancamento getLancamento() {
        return lancamento;
    }

    public void setLancamento(Lancamento lancamento) {
        this.lancamento = lancamento;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public BigDecimal getValorTotalPagamento() {
        return valorTotalPagamento;
    }

    public void setValorTotalPagamento(BigDecimal valorTotalPagamento) {
        this.valorTotalPagamento = valorTotalPagamento;
    }

    public BigDecimal getValorTotalProtocolo() {
        return valorTotalProtocolo;
    }

    public void setValorTotalProtocolo(BigDecimal valorTotalProtocolo) {
        this.valorTotalProtocolo = valorTotalProtocolo;
    }

    public BigDecimal getTotalCredito() {
        return totalCredito;
    }

    public void setTotalCredito(BigDecimal totalCredito) {
        this.totalCredito = totalCredito;
    }

    public BigDecimal getTotalDebito() {
        return totalDebito;
    }

    public void setTotalDebito(BigDecimal totalDebito) {
        this.totalDebito = totalDebito;
    }

    public BigDecimal getTotalReceber() {
        return totalReceber;
    }

    public void setTotalReceber(BigDecimal totalReceber) {
        this.totalReceber = totalReceber;
    }

    public BigDecimal getTotalReceita() {
        return totalReceita;
    }

    public void setTotalReceita(BigDecimal totalReceita) {
        this.totalReceita = totalReceita;
    }

    public BigDecimal getTotalCartorio() {
        return totalCartorio;
    }

    public void setTotalCartorio(BigDecimal totalCartorio) {
        this.totalCartorio = totalCartorio;
    }

    public BigDecimal getTotalFermojupi() {
        return totalFermojupi;
    }

    public void setTotalFermojupi(BigDecimal totalFermojupi) {
        this.totalFermojupi = totalFermojupi;
    }
    
     public int getQtdePagamentos() {
        return qtdePagamentos;
    }

    public void setQtdePagamentos(int qtdePagamentos) {
        this.qtdePagamentos = qtdePagamentos;
    }

    public int getQtdeProtocolos() {
        return qtdeProtocolos;
    }

    public void setQtdeProtocolos(int qtdeProtocolos) {
        this.qtdeProtocolos = qtdeProtocolos;
    }

    public int getQtdeSelos() {
        return qtdeSelos;
    }

    public void setQtdeSelos(int qtdeSelos) {
        this.qtdeSelos = qtdeSelos;
    }

    public Protocolo getProtocolo() {
        return protocolo;
    }

    public void setProtocolo(Protocolo protocolo) {
        this.protocolo = protocolo;
    }

    public Pagamento getPagamento() {
        return pagamento;
    }

    public void setPagamento(Pagamento pagamento) {
        this.pagamento = pagamento;
    }

    public Lancamento getRemovelancamento() {
        return removelancamento;
    }

    public void setRemovelancamento(Lancamento removelancamento) {
        this.removelancamento = removelancamento;
    }
    
    public void clean(){
        this.lancamento = new Lancamento();
        this.usuario = new Usuario();
    }
    
    public void buscar() {
        this.lancamento.setPrestador(usuario);
        lancamento.setProtocolos(lancamentoServico.findProtocolos(lancamento));
        lancamento.setPagamentos(lancamentoServico.findPagamentos(lancamento));
        totalCartorio = calculaTotalCartorio(lancamento.getProtocolos());
        totalFermojupi = calculaTotalFermojupi(lancamento.getProtocolos());
        valorTotalProtocolo = totalCartorio.add(totalFermojupi);
        valorTotalPagamento = calculaTotalPagamentos(lancamento.getPagamentos());

        List<Protocolo> protocolos = new ArrayList<Protocolo>();
        for (Protocolo p : lancamento.getProtocolos()) {
            List<ServicoProtocolo> lstSelos = protocoloServico.servicoProtocolos(p);
            p.setServicoProtocolos(protocoloServico.servicoProtocolos(p));
            protocolos.add(p);
            for (ServicoProtocolo servicoProtocolo : lstSelos) {
                qtdeSelos += servicoProtocolo.getSelos() != null ? servicoProtocolo.getSelos().size() : 0;
            }
        }
        lancamento.setProtocolos(protocolos);

        qtdeProtocolos = lancamento.getProtocolos() != null ? lancamento.getProtocolos().size() : 0;
        qtdePagamentos = lancamento.getPagamentos() != null ? lancamento.getPagamentos().size() : 0;

        totalCredito = lancamentoServico.totalPago(lancamento.getDataLanc());
        totalDebito = valorTotalPagamento;
        totalReceber = lancamentoServico.totalAreceber(lancamento.getDataLanc());
        
        if(totalDebito == null){
            totalDebito = BigDecimal.ZERO;
        }
        if(totalCredito == null){
            totalCredito  = BigDecimal.ZERO;
        }
        if(totalDebito != null){
            totalReceita = totalCredito.subtract(totalDebito);
        }else{
            totalReceita = BigDecimal.ZERO;
        }
        showLancamento = true;
        
        System.err.println(totalCredito + " - " + totalDebito);

    }

    public void salvar() {
        usuario = usuarioServico.find(usuario.getId());
        this.lancamento.setPrestador(this.usuario);

        if (!lancamentoServico.existe(lancamento)) {
            Usuario user = usuarioServico.verificarUsuarioNome(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
            this.lancamento.setRecebedor(user);
            this.lancamento.setValorCartorio(totalCartorio);
            this.lancamento.setValorDescont(new BigDecimal(0));
            this.lancamento.setValorFermojupi(totalFermojupi);
            lancamentoServico.salvar(lancamento);
            Msg.messagemInfo("Lançamento salvo com sucesso.");
            init();
        } else {
            Msg.messagemError("Lancamento ja existente.");
        }

    }

    public void redirect(String string) {
        try {
            FacesContext context = FacesContext.getCurrentInstance();
            context.getExternalContext().redirect(string);
        } catch (IOException ex) {
            Logger.getLogger(ManagerConsultarAtoItem.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

   

    public BigDecimal calculaTotalCartorio(List<Protocolo> protocolos) {
        BigDecimal result = new BigDecimal(0);
        for (Protocolo p : protocolos) {
            result = result.add(p.getValorTotalCartorio());
        }
        return result;
    }

    public BigDecimal calculaTotalFermojupi(List<Protocolo> protocolos) {
        BigDecimal result = new BigDecimal(0);
        for (Protocolo p : protocolos) {
            result = result.add(p.getValorTotalFermojupi());
        }
        return result;
    }

    public BigDecimal calculaTotalPagamentos(List<Pagamento> pagamentos) {
        BigDecimal result = new BigDecimal(0);
        for (Pagamento p : pagamentos) {
            result = result.add(p.getValor());
        }
        return result;
    }

    public BigDecimal calculaTotalAReceber(List<Protocolo> protocolos) {
        BigDecimal resp = new BigDecimal(0);
        for (Protocolo protocolo1 : protocolos) {
            for (Parcela p : protocolo1.getParcelas()) {
                if (p.isAtivo()) {
                    resp = resp.add(p.getValorAPagar());
                }
            }
        }
        return resp;
    }

    public void remover(){
        lancamentoServico.remover(removelancamento);
        Msg.messagemInfo("Lancamento exluido com sucesso.");
    } 
    
   
    
    
}